// 链表来实现栈
// es5 没有class关键字
// es6 有class关键字
// 为什么es5不提供class关键字？

// 定义链表节点ListNode
class ListNode{
    constructor(val){ //val存储实际的数据
        this.val = val;//this 指向当前函数“被调用时所属的那个对象”。
        this.next = null;// 离散 next 指向下一个节点
    }
}
// 定义栈linkedListStack
class LinkedListStack{
    // 加“#”表示私有属性，只能在类的内部访问使用  封装实现的细节，保护类不会被随意修改  
    // 栈顶指针
    #stackPeek;
    //栈的大小
    #size = 0;
    constructor(){
        // 初始化栈顶指针为空
        this.#stackPeek = null;
    }
    // 入栈方法
    push(val){
        const node = new ListNode(val);// <- 用传进来的值
        node.next = this.#stackPeek;
        this.#stackPeek = node;// <- 栈顶指针指向新节点
        this.#size++;
    }
    // 查看栈顶元素
    peek(){
        if(!this.#stackPeek) throw new Error('栈为空');
        return this.#stackPeek.val;
    }
    // 出栈方法
    pop(){
        const num = this.peek();
        this.#stackPeek = this.#stackPeek.next;
        this.#size--;
        return num;
    }
    // 查看栈的大小
    // get 属性 可以直接访问类的属性，不需要调用方法
    get size(){
        return this.#size;
    }
    // 查看栈是否为空
    isEmpty(){
        return this.size === 0;
    }
    // 栈转换为数组
    toArray(){
        let node = this.#stackPeek;
        const res = new Array(this.size);
        for(let i = res.length - 1; i >= 0; i--){
            res[i] = node.val;
            node = node.next;
        }
        return res;
    }
}
 
const stack = new LinkedListStack();
console.log(stack.size);